למה הקוד הבא זורק שגיאה?
protected $db = db::get_instance();

והקוד הבא עובד מצוין?
protected $db;
   
    public function __construct() {
        $this->db = db::get_instance();
    }

14 תשובות

avatar ענה Th3Location ב 19 לאוגוסט 2012 #

איזו שגיאה...אני בטוח מסוג FATAL ERROR...
לא ראיתי אף פעם אפשרות של איתחול מאפיין ישירות כאינטנס של מחלקה סטטית...
(אלא אם מדובר בסינגלטון מה שנראה לי שאתה רוצה לממש, שזה מאתחל את המאפיין כאובייקט רק בעת הקריאה לו ולא בעת איתחול המחלקה עצמה)
בד"כ מאפייני מחלקה יכולים להיות מסוג COPMOUND / SCALAR (מה שאומר מערכים, מחרוזות, ספרות - שלמים ועשרוניים)

avatar ענה cthulhu ב 19 לאוגוסט 2012 #

php לא מבצע כאלה דברים בזמן קומפילציה. אתה לא יכול לזמן פונקציות ככה ישירות, אלא רק במתודה אחרת או בבנאי.

avatar ענה OrelBeY ב 19 לאוגוסט 2012 #

כן, זה סינגלטון.
"שזה מאתחל את המאפיין כאובייקט רק בעת הקריאה לו ולא בעת איתחול המחלקה עצמה." - יש דרך לעשות את זה?
תודה. :)

avatar ענה iiddaannyy ב 19 לאוגוסט 2012 #

בניית המחלקות (והמאפיינים של המחלקות) נעשית בזמן קומפילציה.
בזמן קומפילציה אי אפשר להריץ פונקציות, לבצע חישובים או בדיקות לוגיות - אלא רק להכניס ערכים קבועים.
לא יעבוד:

class x {
    public $x = 3+4;
}

יעבוד:
class x {
    public $x;
    public function __construct() {
        $this->x = 3+4;
    }
}

זה כי אי אפשר לבצע חישובים (3+4) בזמן קומפילציה.
ובדיוק מאותה סיבה גם אי אפשר לתת לקבועים ערכים מורכבים, כי גם הם נבנים בזמן קומפילציה.

ציטוט מהדוקומנטציה:
This declaration may include an initialization, but this initialization must be a constant value--that is, it must be able to be evaluated at compile time and must not depend on run-time information in order to be evaluated.

http://www.php.net/manual/en/language.oop5.properties.php

avatar ענה OrelBeY ב 19 לאוגוסט 2012 #

אוה, זה היה ממש בהתחלה של העמוד. פספסתי את זה.
תודה. :)

avatar ענה Michael ב 19 לאוגוסט 2012 #

אהבתי איך עידן לקח את המילה קומפליציה ושימש אותה במשמעות אחרת לגמרי :-)

avatar ענה iiddaannyy ב 19 לאוגוסט 2012 #

@Michael
חח מה זאת אומרת? :)

avatar ענה Michael ב 19 לאוגוסט 2012 #

ז"א שכל המשפט שלך הוא די לא נכון. לקחת את המילה שהשתמש בא cthulhu והבאת לה משמעות אחרת לגמרי.

avatar ענה iiddaannyy ב 19 לאוגוסט 2012 #

אם משהו לא נכון אני יותר מאשמח שתתקן אותי. :)

avatar ענה Michael ב 20 לאוגוסט 2012 #

אין פה מה לתקן, המשפט שגוי כולו. לקחת מילה ונתת לה משמעות אחרת.
"בניית המחלקות (והמאפיינים של המחלקות) נעשית בזמן קומפילציה."
"בזמן קומפילציה אי אפשר להריץ פונקציות, לבצע חישובים או בדיקות לוגיות - אלא רק להכניס ערכים קבועים."
פשוט תקרא על תהליך ההידור, ואיך האינטרפרטר של זנד engine עובד.

avatar ענה iiddaannyy ב 20 לאוגוסט 2012 #

לא הבנתי את הבעיה.
php לא מחשבת ערכים בזמן בניית המחלקות.
אי אפשר גם להציב משתנים בתור מאפיינים, כי המשתנים מוגדרים בזמן ריצה.
אי אפשר לעשות משהו כזה:

$var = 5;
const C = $var;

כי var נוצר בזמן ריצה ומחלקות והקבועים שלהן לא.

avatar ענה iiddaannyy ב 20 לאוגוסט 2012 #

ובכלל, קבועים שנוצרים עם const נוצרים ב-compile time (אולי באנגלית תאהב את הביטוי יותר :P ) לעומת קבועים שנוצרים עם define שנוצרים בזמן ריצה.
ומשום שבזמן בניית המחלקות php לא יכולה להריץ פונקציות - קבוע של מחלקה מוגדר עם const ולכן אי אפשר להכניס לו ערכים שתלויים בזמן ריצה (3+4 מחושב בזמן ריצה עד כמה שאני יודע ולכן הוא נותן שגיאה).

אבל גלשתי קצת מנושא אז לא משנה... (:

avatar ענה Michael ב 20 לאוגוסט 2012 #

מה שאתה אומר זה נכון, אבל אתה מערבב מושגים לא נכונים ועושה בהם שימוש לא נכון.

avatar ענה iiddaannyy ב 20 לאוגוסט 2012 #

לא הבנתי איפה ערבבתי מושגים לא נכונים. תגיד לי איפה טעיתי כדי שלהבא אני לא אטעה. (: